package com.kinglone.util;

    import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
      
/**
 * 
 * 通过读取已存在的PDF模板生成
 * @templateName 放在template包中生效
 * @filePath 文件路径 例："D:/temp/mb.pdf"
 * @fileName 文件名 不需要后缀
 * @map 填充的数据
 * 
 */
    public class PDFutils {  
    	
        // 利用模板生成pdf 
    	public static void  createPDF(HttpServletRequest request,String template,String filePath,String fileName,Map<String,Object> map,String suffix) {  
    		String tempPath = PDFutils.class.getPackage().getName().replace(".", "/")+"/template/";
    		// 模板路径  
        	String templateName = tempPath+template;  
            // 生成的新文件路径  
            File outFile = new File(filePath+File.separator+fileName+suffix); 
			// 如果输出目标文件夹不存在，则创建
			if (!outFile.getParentFile().exists()) {
				outFile.getParentFile().mkdirs();
			}
            PdfReader reader;  
            FileOutputStream out;  
            ByteArrayOutputStream bos;  
            PdfStamper stamper;  
		     //字体
            ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();   
		    BaseFont bf;
            try {  
            	//bf = BaseFont.createFont(tempPath+"SIMHEI.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//创建字体
            	bf = BaseFont.createFont(tempPath+"SIMSUN.TTC,1", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//创建字体
            	fontList.add(bf);  
//            	bf = BaseFont.createFont( "C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//创建字体
//            	fontList.add(bf);  
                out = new FileOutputStream(outFile);		// 输出流  
                reader = new PdfReader(templateName);			// 读取pdf模板  
                bos = new ByteArrayOutputStream();  
                stamper = new PdfStamper(reader, bos);  
                AcroFields form = stamper.getAcroFields();  
                form.setSubstitutionFonts(fontList);
                Set<String> set = map.keySet();
                Iterator<String > it = set.iterator();
                while(it.hasNext()){
                	String s = it.next();
                	form.setField(s, (String) map.get(s));
                }
                stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑，一定要设为true  
                stamper.close();  
                Document doc = new Document();  
                PdfCopy copy = new PdfCopy(doc, out);  
                doc.open();  
                PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);  
                copy.addPage(importPage);  
                doc.close();  
                importPage.closePath();
            } catch (IOException e) {  
            	e.printStackTrace();
            } catch (DocumentException e) {  
            	e.printStackTrace();
            }  
      
        }  
    	// 利用模板生成pdf 
    	public static void  createPDF4Allopatry(HttpServletRequest request,String template,String filePath,String fileName,Map<String,Object> map,String suffix) {  
    		String tempPath = PDFutils.class.getPackage().getName().replace(".", "/")+"/template/";
    		// 模板路径  
        	String templateName = tempPath+template;  
            // 生成的新文件路径  
            File outFile = new File(filePath+File.separator+fileName+suffix); 
			// 如果输出目标文件夹不存在，则创建
			if (!outFile.getParentFile().exists()) {
				outFile.getParentFile().mkdirs();
			}
            PdfReader reader;  
            FileOutputStream out;  
            ByteArrayOutputStream bos;  
            PdfStamper stamper;  
		     //字体
            ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();   
		    BaseFont bf;
            try {  
            	bf = BaseFont.createFont(tempPath+"SIMHEI.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//创建字体
            	fontList.add(bf);  
//            	bf = BaseFont.createFont( "C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//创建字体
//            	fontList.add(bf);  
                out = new FileOutputStream(outFile);		// 输出流  
                reader = new PdfReader(templateName);			// 读取pdf模板  
                bos = new ByteArrayOutputStream();  
                stamper = new PdfStamper(reader, bos);  
                AcroFields form = stamper.getAcroFields();  
                form.setSubstitutionFonts(fontList);
                Set<String> set = map.keySet();
                Iterator<String > it = set.iterator();
                while(it.hasNext()){
                	String s = it.next();
                	form.setField(s, (String) map.get(s));
                }
                stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑，一定要设为true  
                stamper.close();  
                Document doc = new Document();  
                PdfCopy copy = new PdfCopy(doc, out);  
                doc.open();  
                int count = reader.getNumberOfPages();
                for (int num = 1 ; num <= count ; num++) {
                	PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), num);  
                	copy.addPage(importPage);  
                	importPage.closePath();
                }
//                PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);  
//                PdfImportedPage importPage2 = copy.getImportedPage(new PdfReader(bos.toByteArray()), 2);  
//                PdfImportedPage importPage3 = copy.getImportedPage(new PdfReader(bos.toByteArray()), 3);  
//                copy.addPage(importPage);  
//                copy.addPage(importPage2);  
//                copy.addPage(importPage3);  
                doc.close();  
//                importPage.closePath();
            } catch (IOException e) {  
            } catch (DocumentException e) {  
            }  
      
        }  
    }  